package com.sofa.user.controller;


import com.sofa.common.domain.PageResult;
import com.sofa.user.domain.dto.UserDTO;
import com.sofa.user.domain.po.User;
import com.sofa.user.domain.vo.UserVO;
import com.sofa.user.service.IUserService;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;


@Slf4j
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    private final IUserService userService;


    /**
     * 用户注册,默认绑定用户权限
     * @param userDTO
     */
    @PostMapping("/register")
    @ApiOperation("用户注册")
    public Boolean register(@RequestBody @Validated UserDTO userDTO) {
        return userService.register(userDTO);
    }

    /**
     * 用户登录
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/login")
    @ApiOperation("用户登录")
    public UserVO login(@RequestParam String username, @RequestParam String password) {
        return userService.login(username, password);
    }

    /**
     * 分页查询用户信息列表
     * 根据权限校验结果返回：普通用户仅自己，管理员所有普通用户，超管全部
     * @return
     */
    @GetMapping("/users")
    @ApiOperation("分页获取用户列表")
    public PageResult<UserVO> getUsers(@RequestParam(defaultValue = "1") Integer page,
                                     @RequestParam(defaultValue = "10") Integer pageSize) {
        return userService.getUsers(page, pageSize);
    }


    /**
     * 查询用户信息
     * 根据权限校验结果返回：普通用户仅自己，管理员所有普通用户，超管全部
     *
     * @return
     */
    @GetMapping("/{userId}")
    @ApiOperation("获取用户信息")
    public UserVO getUserById(@PathVariable Long userId) {
        return userService.getUserById(userId);
    }

    /**
     * 超管调用: 升级为管理员
     * @param userId 用户id
     */
    @PostMapping("/upgrade/{userId}")
    @ApiOperation("升级用户为管理员")
    public Boolean upgradeToAdmin(@PathVariable Long userId) {
        return userService.upgradeToAdmin(userId);
    }

    /**
     * 超管调用: 降级为普通用户
     * @param userId 用户id
     */
    @PostMapping("/downgrade/{userId}")
    @ApiOperation("将用户降级为普通用户")
    public Boolean downgradeToUser(@PathVariable Long userId) {
        return userService.downgradeToUser(userId);
    }


    /**
     * 更新用户信息
     * 普通用户改自己，管理员改普通用户，超管改所有
     * @param userId 要更改的用户id
     * @param user 更改后的信息
     */
    @PutMapping("/{userId}")
    @ApiOperation("更新用户信息")
    public Boolean updateUserById(@PathVariable Long userId, @RequestBody User user) {
        user.setId(userId);
        return userService.updateUserById(user);
    }

    /**
     * 重置用户密码
     * 普通用户改自己，管理员改普通用户，超管改所有
     * @param userId 要重置密码的用户id
     */
    @PostMapping("/resetPassword")
    @ApiOperation("重置用户密码")
    public Boolean resetPassword(@RequestParam Long userId) {
        return userService.resetPassword(userId);
    }

}
